package ar.edu.utn.frba.tacs.mercadowarnessh.facturacion;

import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.tacs.warnes.entities.Pedido;

/**
 * 
 * @author Diego Se encarga de notificar la efectivizacion de un pedido a traves
 *         de SOAP
 */
public class NotificadorDePedidosSOAP {

	private static NotificadorDePedidosSOAP instancia;
	private PedidosService pedidoServiceSOAP;
	private List<Pedido> pedidosEfectivizados;

	/**
	 * Singleton
	 * 
	 * @return NotificadorDePedidosSOAP
	 */
	public static NotificadorDePedidosSOAP getInstance() {
		if (instancia == null) {
			instancia = new NotificadorDePedidosSOAP();
		}
		return instancia;
	}

	private NotificadorDePedidosSOAP() {
		PedidosServiceImplService service = new PedidosServiceImplService();
		this.pedidoServiceSOAP = service.getPort(PedidosService.class);
		this.pedidosEfectivizados = new ArrayList<Pedido>();
	}

	/**
	 * Cuando un pedido se efectiviza se llama a este metodo para avisar a
	 * facturacion.
	 * 
	 * @param pedido
	 */
	public void efectivizarPedido(Pedido pedido) {
		this.notificarEfectivizacionDePedido(pedido);
	}

	/**
	 * Notifica de la efectivizaci�n de un pedido a SOAP.
	 */
	private void notificarEfectivizacionDePedido(Pedido pedido) {
		this.pedidoServiceSOAP.notificarPedidoEfectivo(this
				.convertirPedidoAPedidoSOAP(pedido));
		this.agregarPedidoEfectivizado(pedido);
	}

	/**
	 * Convierte un pedido de nuestro dominio a un pedido perteneciente a la
	 * aplicaci�n SOAP.
	 */
	private ar.edu.utn.frba.tacs.mercadowarnessh.facturacion.Pedido convertirPedidoAPedidoSOAP(
			ar.edu.utn.frba.tacs.warnes.entities.Pedido pedido) {
		ar.edu.utn.frba.tacs.mercadowarnessh.facturacion.Pedido pedidoSOAP = new ar.edu.utn.frba.tacs.mercadowarnessh.facturacion.Pedido();
		pedidoSOAP.setId(pedido.getId());
		for (ar.edu.utn.frba.tacs.warnes.entities.Pieza pieza : pedido
				.getPiezas()) {
			ar.edu.utn.frba.tacs.mercadowarnessh.facturacion.Pieza piezaSOAP = new ar.edu.utn.frba.tacs.mercadowarnessh.facturacion.Pieza();
			piezaSOAP.setId(pieza.getId());
			piezaSOAP.setDescripcion(pieza.getDescripcion());
			piezaSOAP.setPrecio(pieza.getPrecioEnPesos());
			pedidoSOAP.getPiezas().add(piezaSOAP);
		}
		return pedidoSOAP;
	}

	public List<Pedido> getPedidosEfectivizados() {
		return this.pedidosEfectivizados;
	}

	public void setPedidosEfectivizados(List<Pedido> pedidosEfectivizados) {
		this.pedidosEfectivizados = pedidosEfectivizados;
	}

	public void agregarPedidoEfectivizado(Pedido pedido) {
		this.pedidosEfectivizados.add(pedido);
	}

	/**
	 * Lleva el contro de los pedidos se aviso a facturacion sobre su
	 * efectivizacion.
	 * 
	 * @param pedido
	 * @return <b>TRUE</b> Si el pedido esta efectivizado y se aviso a
	 *         facturacion. <b>FALSE</b> Si el pedido NO esta efectivizado o NO
	 *         se aviso a facturacion.
	 */
	public boolean seAvisoAFacturacion(Pedido pedido) {
		return this.getPedidosEfectivizados().contains(pedido);
	}

}
